package main

import "fmt"

// 内存地址:在声明变量时，会在计算机内存中申请一个位置，
// 用于存储、修改和获取变量的值，这个位置被称为内存地址，
// 内存地址使用十六进制表示。

//指针:这个内存地址赋值给另外一个变量，
// 这个变量就叫做指针。
// 指针也是一种类型，只不过指针存储的是一个内存地址。

//go语言中，指针的定义方式如下:
// var pointer *int
// 其中，pointer是一个指针变量，*int表示这个指针指向的是一个整型变量的内存地址。
func updateStringWithPointer(x *string) {
	*x = "modified"
}
func main() {
	var s string = "hello world"
	fmt.Println(&s)
	sp := &s         // 取变量s的地址，赋值给指针sp
	fmt.Println(*sp) // 通过指针访问变量的值
	//指针未初始化时，其值为nil。
	updateStringWithPointer(sp)
	fmt.Println(s) // 查看变量s的值是否被修改

	var a int = 10
	var p *int = &a // 取变量a的地址，赋值给指针p
	fmt.Println(*p) // 通过指针访问变量的值
	*p = 20         // 通过指针修改变量的值
	fmt.Println(a)  // 查看变量a的值是否被修改
}
